Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

System.OutOfMemoryException

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος evagelos στις 23-11-2013, 11:18. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-11-2013, 22:48 74634

    System.OutOfMemoryException

    Γεια σας παιδιά,

    Εχω φτιάξει ενα προγραμμα το οποίο διαβάζει φωτογραφίες απο ενα φακελο, αλλάζει το Resolution και τα κανει upload σε ενα ftp server.

    το πρόβλημα ειναι ότι καποια στιγμή πετάει μηνυμα "System.OutOfMemoryException".

    Τα αρχεία που θέλω να ανεβάσω ειναι περίπου 400-500 προς το παρόν.

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Drawing.Imaging;
    using System.Drawing;
    using System.Net;

    namespace myCustom
    {
        class uploadPic
        {
            string _ftpPath = "";
            string _fromPicdir = "";
            Int32 fileCount = 0;
            Int32 i = 1;
           
            public void loadFiles(string fromPicdir, string ftpPath)
            {
                _fromPicdir = fromPicdir;
                _ftpPath = ftpPath;

                string[] fileEntries = Directory.GetFiles(_fromPicdir);
                fileCount = Directory.GetFiles(_fromPicdir).Length;

                if (fileCount > 0)
                {
                    foreach (string fileName in fileEntries)
                    {
                        chRes(fileName);
                    }
                }
            }


            private void chRes(string _fileName)
            {
                using (Bitmap bitmap = (Bitmap)Image.FromFile(_fileName))
                {
                    using (Bitmap newBitmap = new Bitmap(bitmap))
                    {
                        newBitmap.SetResolution(72, 72);
                        try
                        {
                            newBitmap.Save(Path.GetTempPath() + "\\" + Path.GetFileName(_fileName), ImageFormat.Jpeg);

                            uploadFile(_ftpPath
                                , "myUser"
                                , "myPass"
                                , Path.GetTempPath() + "/" + Path.GetFileName(_fileName)
                            );
                        }
                        catch (Exception ex)
                        {
                            string asd = ex.Message;
                        }
                    }
                }
            }

            private void uploadFile(string ftpurl, string ftpusername, string ftppassword, string fileName)
            {
                try
                {
                    string filename = Path.GetFileName(fileName);
                    string ftpfullpath = ftpurl + Path.GetFileName(fileName);
                    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);
                    ftp.Credentials = new NetworkCredential(ftpusername, ftppassword);
                                   
                    ftp.KeepAlive = true;
                    ftp.UseBinary = true;
                    ftp.Method = WebRequestMethods.Ftp.UploadFile;

                    FileStream fs = File.OpenRead(fileName);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    fs.Close();

                    Stream ftpstream = ftp.GetRequestStream();
                    ftpstream.Write(buffer, 0, buffer.Length);
                    ftpstream.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("There was an error connecting to the FTP Server");
       }
            }

     

        }
    }

     

     

     

  •  13-11-2013, 23:11 74637 σε απάντηση της 74634

    Απ: System.OutOfMemoryException

    To OutOfMemory συνήθως παραθέτει ότι κάποιο non-managed resource δεν γίνεται dispose σωστά με αποτέλεσμα ότι σου τρώει την μνήμη...

    Αν και βλέπω ότι κάνεις χρήση using για τα bitmaps...

    Που ακριβώς παίρνεις το μήνυμα λάθους;

     

    George J.
     

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  15-11-2013, 18:46 74655 σε απάντηση της 74637

    Απ: System.OutOfMemoryException

    Καταρχήν να παρατηρήσω ότι δεν καλείται ποτέ η GetResponse() οπότε απλά δημιουργούνται συνέχεια requests, γράφονται δεδομένα και δεν φεύγουν ποτέ.

    Όσον αφορά το ίδιο το μήνυμα, μπορεί να εμφανιστεί και αν δημιουργούνται πάρα πολλά Large Objects (>80K) τα οποία ο Garbage Collector δεν προλαβαίνει να καθαρίσει. Και με δεδομένο ότι τα Large Objects καθαρίζονται πολύ πιο αραιά από τα μικρά, μπορεί άνετα να δεις κανένα τέτοιο μήνυμα μαζί με ανεξήγητη αύξηση της μνήμης.

    Για παράδειγμα, ο κώδικας πρώτα αποθηκεύει το νέο bitmap στο σκληρό, μετά το ξαναφορτώνει ολόκληρο σε ένα buffer και ύστερα το στέλνει. Πέρα από την καθυστέρηση που προκαλεί αυτό, δημιουργεί και ένα περιττό buffer κάθε φορά. Η Bitmap.Save μπορεί να σώσει και σε stream απευθείας, οπότε θα μπορούσε να σώσει στο Request stream και να μην παρέμβει καθόλου ο σκληρός δίσκος. Η χρήση δύο Bitmap είναι επίσης περίεργη.

    Άλλα περίεργα είναι ότι τα exceptions καταπίνονται, οπότε κανείς δεν ξέρει αν έτρεξε τίποτε, έσκασε, γιατί, πότε, πού κλπ. Είναι πολύ κακή ιδέα να γυρίζει κανείς ένα error string ή status code αντί για το ίδιο το exception. Τα exceptions είναι σαν την ασφάλεια του πίνακα. Αν καεί, πρέπει να δεις γιατί και μετά να την αλλάξεις. Τα error codes είναι σαν να τύλιξες την ασφάλεια με αλουμινόχαρτο γιατί βαριόσουν να δεις τί έγινε


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-11-2013, 12:22 74696 σε απάντηση της 74655

    Απ: System.OutOfMemoryException

    Αρα αν καταλαβα καλά εκανα αυτές τις 2 αλλαγες:


            private void chRes(string _fileName)
            {
                using (Bitmap bitmap = (Bitmap)Image.FromFile(_fileName))
                {
                    using (Bitmap newBitmap = new Bitmap(bitmap))
                    {
                        newBitmap.SetResolution(72, 72);
                        try
                        {
                            //newBitmap.Save(Path.GetTempPath() + "\\" + Path.GetFileName(_fileName), ImageFormat.Jpeg);
                            //Stream myStream;
                            MemoryStream ms = new MemoryStream();
                            newBitmap.Save(ms, ImageFormat.Jpeg);

                            uploadFile(_ftpPath //"ftp://ftp.myftpaddress.gr/pictures/"
                                , "username"
                                , "password"
                                , Path.GetTempPath() + "/" + Path.GetFileName(_fileName)
                                , ms
                            );
                        }
                        catch (Exception ex)
                        {
                            string asd = ex.Message;
                        }
                    }
                }
            }


            private void uploadFile(string ftpurl, string ftpusername, string ftppassword, string fileName, Stream fs)
            {
                try
                {
                    string filename = Path.GetFileName(fileName);
                    string ftpfullpath = ftpurl + Path.GetFileName(fileName);
                    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);
                    ftp.Credentials = new NetworkCredential(ftpusername, ftppassword);

                    ftp.KeepAlive = true;
                    ftp.UseBinary = true;
                    ftp.Method = WebRequestMethods.Ftp.UploadFile;

                    //FileStream fs = File.OpenRead(fileName);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    fs.Close();

                    Stream ftpstream = ftp.GetRequestStream();
                    ftpstream.Write(buffer, 0, buffer.Length);
                    ftpstream.Close();
                }
                catch (Exception ex)
                {
                    //MessageBox.Show("There was an error connecting to the FTP Server" +
                    //Environment.NewLine + ex.Message);
                }
            } 

     

     

    Aυτό με τα "exceptions που καταπίνονται" εννοείς για τα σχολια που εχω βαλει στο catch; αν εννοείς αυτό ειναι για test σκοπους. Θα το διαχειριστώ

  •  22-11-2013, 16:18 74698 σε απάντηση της 74696

    Απ: System.OutOfMemoryException

    Βασικά, έλεγα για κάτι σαν κι αυτό:

     

    private static void Main(string[] args)
       {
           var ftpPath = new Uri("ftp://ftp.myftpaddress.gr/pictures/");
           SendThumbnail(ftpPath, @"C:\Users\p.kanavos\Pictures\douglas_engelbart_and_mouse.jpg");
       }
     
       private static void SendThumbnail(Uri ftpPath, string fileName)
       {
           using (var bitmap =(BitmapImage.FromFile(fileName))
           {
               bitmap.SetResolution(72,72);
     
               var request = CreateRequest(ftpPath, "username""password", fileName);
               using (var stream = request.GetRequestStream())
               {
                   bitmap.Save(stream,ImageFormat.Jpeg);
               }
               using (var response = (FtpWebResponse)request.GetResponse())
               {
                   Console.WriteLine("Status: {0}", response.StatusDescription);
               }
               
           }
       }
     
       private static FtpWebRequest CreateRequest(Uri ftpUri, string userName, string password, string fileName)
       {
           string name = Path.GetFileName(fileName);
           var ftpfullpath = new Uri(ftpUri, name);
     
           var ftp = (FtpWebRequest)WebRequest.Create(ftpfullpath);
           ftp.Credentials = new NetworkCredential(userName, password);
     
           ftp.KeepAlive = true;
           ftp.UseBinary = true;
           ftp.Method = WebRequestMethods.Ftp.UploadFile;
           return ftp;
       }

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-11-2013, 18:43 74700 σε απάντηση της 74698

    Απ: System.OutOfMemoryException

    Τα ιδια:

    Ερώτηση. Πρέπει για τις 500+ φωτογρφίες που εχω να ανοίγω καθε φορά ftp connection; Δεν μπορώ να ανοιξω ενα connection και να του λεω upload ; Ετσι λειτουργει το ftp;

    το λαθος πάντος ερχεται απο εδώ:

    using (var bitmap = (Bitmap)Image.FromFile(_fileName))

     

    See the end of this message for details on invoking
    just-in-time (JIT) debugging instead of this dialog box.

    ************** Exception Text **************
    System.OutOfMemoryException: Out of memory.
       at System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
       at System.Drawing.Image.FromFile(String filename)
       at S1Custom.uploadPic.chRes(String _fileName)
       at S1Custom.uploadPic.loadFiles(String fromPicdir, String ftpPath)
       at S1Custom.DLLForm.button4_Click_1(Object sender, EventArgs e)
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** Loaded Assemblies **************
    mscorlib
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3649 (GDR.050727-3600)
        CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
    ----------------------------------------
    S1Interop
        Assembly Version: 1.0.4359.28785
        Win32 Version:
        CodeBase: file:///C:/Documents%20and%20Settings/All%20Users/Application%20Data/SoftOne/Azure/S1Interop.DLL
    ----------------------------------------
    msvcm90
        Assembly Version: 9.0.21022.8
        Win32 Version: 9.00.21022.8
        CodeBase: file:///C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_D08D0375/msvcm90.dll
    ----------------------------------------
    S1System
        Assembly Version: 1.0.0.0
        Win32 Version: 1.0.0.0
        CodeBase: file:///C:/Documents%20and%20Settings/All%20Users/Application%20Data/SoftOne/Azure/S1System.DLL
    ----------------------------------------
    System.Windows.Forms
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3645 (GDR.050727-3600)
        CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3644 (GDR.050727-3600)
        CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Drawing
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3644 (GDR.050727-3600)
        CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    PresentationFramework
        Assembly Version: 3.0.0.0
        Win32 Version: 3.0.6920.4050 built by: GDR
        CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/PresentationFramework/3.0.0.0__31bf3856ad364e35/PresentationFramework.dll
    ----------------------------------------
    WindowsBase
        Assembly Version: 3.0.0.0
        Win32 Version: 3.0.6920.4050 built by: GDR
        CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/WindowsBase/3.0.0.0__31bf3856ad364e35/WindowsBase.dll
    ----------------------------------------
    PresentationCore
        Assembly Version: 3.0.0.0
        Win32 Version: 3.0.6920.4050 built by: GDR
        CodeBase: file:///C:/WINDOWS/assembly/GAC_32/PresentationCore/3.0.0.0__31bf3856ad364e35/PresentationCore.dll
    ----------------------------------------
    S1Custom
        Assembly Version: 1.0.0.0
        Win32 Version: 1.0.0.0
        CodeBase: file:///C:/Documents%20and%20Settings/All%20Users/Application%20Data/SoftOne/Cache/01100262300909/S1Custom.dll
    ----------------------------------------
    System.Data
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
        CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
    ----------------------------------------
    System.Xml
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3654 (GDR.050727-3600)
        CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------
    MySql.Data
        Assembly Version: 6.6.5.0
        Win32 Version: 6.6.5.0
        CodeBase: file:///C:/Documents%20and%20Settings/All%20Users/Application%20Data/SoftOne/Azure/MySql.Data.DLL
    ----------------------------------------
    System.Transactions
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
        CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll
    ----------------------------------------
    System.Configuration
        Assembly Version: 2.0.0.0
        Win32 Version: 2.0.50727.3654 (GDR.050727-3600)
        CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    ----------------------------------------

    ************** JIT Debugging **************
    To enable just-in-time (JIT) debugging, the .config file for this
    application or computer (machine.config) must have the
    jitDebugging value set in the system.windows.forms section.
    The application must also be compiled with debugging
    enabled.

    For example:

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>

    When JIT debugging is enabled, any unhandled exception
    will be sent to the JIT debugger registered on the computer
    rather than be handled by this dialog box.


     

  •  23-11-2013, 11:18 74705 σε απάντηση της 74700

    Απ: System.OutOfMemoryException

    Λοιπόν το λαθος ηταν οτι το αρχείο ΔΕΝ ηταν φωτογραφια ή ειναι χαλασμενη φωτογραφία. Εφτιαξα εναν ελεγχο και οκ

    Ευχαριστώ για την βοήθεια

            bool IsValidImage(string filename)
            {
                try
                {
                    Image newImage = Image.FromFile(filename);
                }
                catch (OutOfMemoryException ex)
                {
                    return false;
                }
                return true;
            }

     

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems